package net.jcip.chapter3;

/**
 * NoVisibility   : Sharing variables without synchronization 没有同步的共享变量
 *
 * 在程序清单3-1中的No Visibility说明了当多个线程在没有同步的情况下共享数据时出现的错误。
 * 在代码中，主线程和读线程都将访问共享变量ready和number。
 * 主线程启动读线程，然后将number设为42，并将ready设为true。
 * 读线程一直循环直到发现ready的值变为true, 然后输出umber.的值。
 *
 * 虽然No Visibility看起来会输出42，但事实上很可能输出0，或者根本无法终止。
 * 这是因为在代码中没有使用足够的同步机制，因此无法保证主线程写入的 ready 值和 number值对于读线程来说是可见的。
 *
 * @author Brian Goetz and Tim Peierls
 */
class NoVisibility {

    private static boolean ready = false;

    private static int number;

    private static class ReaderThread extends Thread {
        public void run() {
            while (!ready){
                System.out.println( "线程空转....");
                Thread.yield();
            }
            System.out.println(number);
        }
    }

    public static void main(String[] args) throws InterruptedException {

        new ReaderThread().start();
        ready = true;
        Thread.sleep(1); //假设一个费时的操作.
        number = 42;
    }
}
